Lost update
複数のトランザクションで更新が並列に行われた場合、あとのトランザクションの結果で上書きされること
code:この時どうなる?.sql
BEGIN;
SELECT subscriber FROM vtuber WHERE id = 1; -- 1000000
-- ここで別のトランザクションによってid=1のsubscriberがsubscriber+1にUPDATEされてcommitされる
UPDATE subscriber SET subscriber = subscriber + 1 WHERE id = 1;
SELECT subscriber FROM vtuber WHERE id = 1; -- ???
この結果はトランザクション分離レベルによって挙動が変わる
REPEATABLE READの時は1000001になる
後の処理で上書きされる
防ぐ
排他ロックをする
READ COMMITTEDの場合、Fuzzy(Non repeatable) readが起きてCOMMIT後の値が参照できるので1000002になる
失敗から学ぶRDBの正しい歩き方 p.189の図